Solving 10385 - Duathlon (Ternary search)
[and.git] / 10261 - Ferry loading / 10261.2.cpp
blob64881b3e1a187f869f42414574c897c96bdbcac6
1 using namespace std;
2 #include <algorithm>
3 #include <iostream>
4 #include <iterator>
5 #include <sstream>
6 #include <fstream>
7 #include <cassert>
8 #include <climits>
9 #include <cstdlib>
10 #include <cstring>
11 #include <string>
12 #include <cstdio>
13 #include <vector>
14 #include <cmath>
15 #include <queue>
16 #include <deque>
17 #include <stack>
18 #include <map>
19 #include <set>
21 #define D(x) cout << #x " is " << x << endl
24 dp[i][j] = Verdadero si puedo repartir los primeros i carros en orden tal que en el port haya j centímetros usados.
25 (El Starboard tendría entonces sum[i] - j unidades usadas)
27 bool dp[205][10005];
28 int choice[205][10005], w[205], sum[205];
30 int main(){
32 int C;
33 cin >> C;
34 bool print_stupid_empty_line = false;
36 while(C--){
37 if (print_stupid_empty_line) cout << endl;
38 print_stupid_empty_line = true;
40 int length;
41 cin >> length;
42 length *= 100;
44 int n = 1;
45 w[0] = sum[0] = 0;
46 for (int x; cin >> x && x; ){
47 if (n <= 200){
48 w[n] = x;
49 sum[n] = sum[n-1] + w[n];
50 ++n;
53 --n;
55 pair<int, int> ans;
57 memset(dp, 0, sizeof dp);
58 memset(choice, -1, sizeof choice);
60 dp[0][0] = true;
61 for (int i=0; i<n; ++i){
62 for (int j=0; j<=length; ++j){
63 if (dp[i][j]){
64 if ((j + w[i+1]) <= length){
65 dp[i+1][j + w[i+1]] = true;
66 choice[i+1][j + w[i+1]] = 1;
67 ans = make_pair(i+1, j + w[i+1]);
70 if ((sum[i] - j + w[i+1]) <= length){
71 dp[i+1][j] = true;
72 choice[i+1][j] = 0;
73 ans = make_pair(i+1, j);
79 cout << ans.first << endl;
80 string output = "";
81 for (int i=ans.first, j=ans.second; i>0 && choice[i][j] != -1; --i){
82 output = (choice[i][j] ? "port\n" : "starboard\n" ) + output;
83 if (choice[i][j]) j -= w[i];
85 cout << output;
88 return 0;